package com.ellison.demo.example;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.function.Consumer;

/**
 * Consumer 接口刚好和Supplier接口相反，它不是用来生产一个数据，而是消费一个数据
 * 数据的类型由泛型来指定
 *
 * @author Ellison_Pei
 * @date 2021/10/25 14:00
 * @since 1.0
 **/
@Slf4j
public class ConsumerTest {
    /**
     * 定义一个方法，方法的参数传递一个字符串和两个Consumer接口，Consumer接口的泛型指定为字符串
     */
    public static void consumer2(String str, Consumer<String> con1, Consumer<String> con2) {
        // andThen 连续消费  default Consumer<String> andThen
        // 先执行左边的Consumer--con1的动作，andThen--->再次执行Consumer--con2动作
        con1.andThen(con2).accept(str);
        // 规则 con1连接con2 ，先执行con1消费数据，在执行con2消费数据
    }

    /**
     * 定义一个方法，方法的参数传递一个Consumer<String>接口，传递一个字符串变量
     */
    public static void consumer(String str, Consumer<String> con) {
        // 使用消费类型接口对象，消费传递的字符串值
        con.accept(str);
    }

    public static void main(String[] args) {
        // 来创建消费方法consumer,Consumer<String>接口是一个函数式接口类型，所以可以使用Lambda表达式
        consumer("abcdefg", name -> {
            // 把里面的abcdefg字符串改为大写输出 消费的规则自定义
            String str = name.toUpperCase();
            String s = new StringBuffer(str).reverse().toString();
            log.debug(s);// GFEDCBA
        });

        // 由于consumers方法的参数Consumer接口是一个函数式接口，可以使用Lambda表达式
        consumer2("Java31-中国最棒-都是业界大佬", (name1) -> {
            // 消费规则
            // 截取传入的字符串
            String sub = name1.substring(0, 6);
            log.debug(sub);
        }, (name2) -> {
            // 定义消费的规则 分成字符串数组展示
            String[] strs = name2.split("-");
            log.debug(Arrays.toString(strs));// {“Java31","中国最棒","都是业界大佬"}
        });
    }

}
